export default{
  // 为当前模块开启命名空间
  namespaced:true,
  
  // 模块的 state 数据
  state:() => ({
    // 购物车的数组，用来存储购物车中每个商品的信息对象
    // 每个商品的信息对象，都包含如下 6 个属性：
    // {goods_id,goods_name,goods_price,goods_count,goods_small_logo,goods_state}
    cart:JSON.parse(uni.getStorageSync('cart') || '[]'),
  }),
  
  
  // 模块的 mutations 方法 :使用它来修改数据(类似于methods)
  mutations:{
    // 1.添加购物车
    addToCart(state,goods){
      // 根据提交的商品的Id，查询购物车中是否存在这件商品，
      // 如果不存在，则findResult 为 undefined；如果循环出来的id等于传进来的id则代表商品存在，
      const findResult = state.cart.find(x => x.goods_id === goods.goods_id);
      
      // console.log(findResult)
      if(!findResult) {
        // 如果购物车中没有这件商品，则直接push
        state.cart.push(goods);
      }else{
        // 如果购物车中有这件商品，则只更新数量即可，
        findResult.goods_count++;
      }
      
      // 通过 commit 方法，调用 m_cart 命名空间下的 saveToStorage 方法，
      this.commit('m_cart/saveToStorage');
      
      // console.log(state.cart);
    },
    // 2.将购物车的数据持久化储存到本地
    saveToStorage(state){
      uni.setStorageSync('cart',JSON.stringify(state.cart));
    },
    
    // 3.更新购物车中商品的勾选状态
    updateGoodsState(state,goods){
      // 根据 goods_id 查询购物车中对应商品的信息对象，
      const findResult = state.cart.find(x => x.goods_id === goods.goods_id);
      
      // 有对应的商品信息对象
      if(findResult){
        // 更新对应商品的勾选状态
        findResult.goods_state = goods.goods_state;
        // 持久化存储到本地
        this.commit('m_cart/saveToStorage');
      }
    },
    // 4.更新购物车中商品的数量
    updateGoodsCount(state,goods){
      // 根据 goods_id 查询购物车中对应商品的信息对象，
      const findResult = state.cart.find(x => x.goods_id === goods.goods_id);
      if(findResult){
        // 更新对应商品的数量
        findResult.goods_count = goods.goods_count;
        // 持久化存储到本地
        this.commit('m_cart/saveToStorage');
      }
    },
    // 5.根据 Id 删除对应的商品
    removeGoodsById(state,goods_id){
      // 调用数组的filter方法进行过滤，过滤掉删除的id
      state.cart = state.cart.filter(x => x.goods_id !== goods_id);
      // 持久化存储到本地
      this.commit('m_cart/saveToStorage');
    },
    // 6.更新购物车中所有商品的勾选状态
    updateAllGoodsState(state,newState){
      // 循环更新购物车中每件商品的勾选状态
      state.cart.forEach(x => x.goods_state = newState);
      // 持久化存储到本地
      this.commit('m_cart/saveToStorage');
    }
    
  },
  // 模块的 getter 属性:类似于computed(计算属性，对现有的状态进行计算得到新的数据 )
  getters:{
    // 统计购物车中商品的总数量
    total(state){
      // let c = 0;
      // // 循环统计商品的数量，累加到变量c中，
      // state.cart.forEach( x => c += x.goods_count );
      // return c;
      
      // 使用reduce 实现以上代码↑↑↑：
      return state.cart.reduce((total,item) => {return total += item.goods_count},0)
    },
    // 勾选的商品的总数量
     checkedCount(state){
      // 先使用filter方法，从购物车中过滤已勾选的商品，
      // 再使用reduce方法，将已勾选的商品总数量进行累加，  
      // reduce() 返回值就是已勾选的商品的总数量
      return state.cart.filter(x=> x.goods_state).reduce((total,item)=>{return total += item.goods_count},0);
    },
    
    // 已勾选商品的总价格
    checkedGoodsAmount(state){
      // 先使用filter方法，从购物车中过滤器已勾选的商品，
      // 再使用reduce方法，将已勾选的商品数量 * 单价之后，进行累加，
      // reduce()的返回值就是已勾选的商品的总价，
      // 最后调用toFixed(2)方法，保留两位小数
      return state.cart.filter(x => x.goods_state).reduce((total,item) => { return total = total + item.goods_count * item.goods_price},0).toFixed(2);
    }
  }
}